<?php
// 数据应用
namespace App\Library\Services;
use App\Library\Utilities\Config;
use App\Library\Traits\DatabaseOperations; // 添加这行，确保引入 DatabaseOperations trait
use Exception;

class DatabaseService
{
    use DatabaseOperations;  // 直接在服务中使用 trait

    private $dbConnection;
    private $dbType;
    private $pdo;

    /**
     * 构造函数，支持传入数据库类型
     *
     * @param string|null $dbType 数据库类型 (默认为 null，表示使用配置文件中的值)
     */
    public function __construct($dbType = null)
    {
        // 获取数据库配置
        $dbConfig = Config::get('Database');
        $systemConfig = Config::get('System');

        // 如果传入了数据库类型，则使用传入的类型；否则使用配置文件中的默认数据库类型
        $this->dbType = $dbType ?? ($systemConfig['db'] ?? 'mysql');
        
        try {
            // 动态实例化数据库连接类
            $this->initializeDatabase($dbConfig[$this->dbType]);
        } catch (Exception $e) {
            // 捕获异常并提供友好的错误提示
            echo $e->getMessage();
            exit;  // 停止执行
        }
    }

    /**
     * 动态实例化数据库连接类
     *
     * @param array $dbConfig 数据库配置项
     * @throws Exception
     */
    private function initializeDatabase(array $dbConfig)
    {
        if (isset($dbConfig['ReflectionPath'])) {
            $dbClass = $dbConfig['ReflectionPath'];  // 获取配置中的 ReflectionPath

            if (class_exists($dbClass)) {
                // 动态实例化数据库连接类
                $this->dbConnection = new $dbClass($dbConfig);
            } else {
                throw new Exception("Database connection class {$dbClass} not found.");
            }
        } else {
            throw new Exception("Database configuration does not contain ReflectionPath.");
        }
    }

    /**
     * 获取数据库连接实例
     *
     * @return mixed
     */
    public function getConnection()
    {
        return $this->dbConnection;
    }

    /**
     * 开始事务
     */
    public function beginTransaction()
    {
        $this->dbConnection->getConnection()->beginTransaction();
    }

    /**
     * 提交事务
     */
    public function commit()
    {
        $this->dbConnection->getConnection()->commit();
    }

    /**
     * 回滚事务
     */
    public function rollBack()
    {
        $this->dbConnection->getConnection()->rollBack();
    }
	
	/**
	 * 批量执行 SQL 语句（支持事务）
	 *
	 * @param array $queries SQL 查询数组，包含 SQL 语句和参数
	 * @return bool 执行结果
	 */
	public function runSqlBatch($queries)
	{
		try {
			// 开始事务
			$this->dbConnection->beginTransaction();
			
			// 执行每一条 SQL
			foreach ($queries as $query) {
				$this->dbConnection->executeQuery($query['sql'], $query['params']);
			}
			
			// 提交事务
			$this->dbConnection->commit();
			
			return true;
		} catch (Exception $e) {
			// 发生异常时回滚事务
			$this->dbConnection->rollBack();
			return false;
		}
	}
}

